/**
 * 事件管理器
 * 用于组件间通信和状态同步
 */

type EventCallback = (...args: any[]) => void;

class EventManagerClass {
    private events: Map<string, EventCallback[]> = new Map();

    /**
     * 监听事件
     * @param eventName 事件名称
     * @param callback 回调函数
     */
    on(eventName: string, callback: EventCallback): void {
        if (!this.events.has(eventName)) {
            this.events.set(eventName, []);
        }
        this.events.get(eventName)!.push(callback);
    }

    /**
     * 取消监听事件
     * @param eventName 事件名称
     * @param callback 回调函数（可选，不传则移除所有监听）
     */
    off(eventName: string, callback?: EventCallback): void {
        if (!this.events.has(eventName)) return;

        if (callback) {
            const callbacks = this.events.get(eventName)!;
            const index = callbacks.indexOf(callback);
            if (index > -1) {
                callbacks.splice(index, 1);
            }
        } else {
            this.events.delete(eventName);
        }
    }

    /**
     * 触发事件
     * @param eventName 事件名称
     * @param args 参数
     */
    emit(eventName: string, ...args: any[]): void {
        if (!this.events.has(eventName)) return;

        const callbacks = this.events.get(eventName)!;
        callbacks.forEach(callback => {
            try {
                callback(...args);
            } catch (error) {
                console.error(`Event callback error for ${eventName}:`, error);
            }
        });
    }

    /**
     * 监听一次性事件
     * @param eventName 事件名称
     * @param callback 回调函数
     */
    once(eventName: string, callback: EventCallback): void {
        const onceCallback = (...args: any[]) => {
            callback(...args);
            this.off(eventName, onceCallback);
        };
        this.on(eventName, onceCallback);
    }

    /**
     * 清除所有事件监听
     */
    clear(): void {
        this.events.clear();
    }

    /**
     * 获取事件监听器数量
     * @param eventName 事件名称
     */
    listenerCount(eventName: string): number {
        return this.events.has(eventName) ? this.events.get(eventName)!.length : 0;
    }
}

// 导出单例实例
export const EventManager = new EventManagerClass();

// 事件名称常量
export const EVENT_NAMES = {
    // 医院相关事件
    HOSPITAL_CHANGE: 'hospital_change',
    SYS_ORG_CHANGE: 'sys_org_change',
    
    // 用户相关事件
    USER_LOGIN: 'user_login',
    USER_LOGOUT: 'user_logout',
    USER_INFO_UPDATE: 'user_info_update',
    
    // 位置相关事件
    LOCATION_CHANGE: 'location_change',
    CITY_CHANGE: 'city_change',
    
    // 其他事件
    PAGE_REFRESH: 'page_refresh',
    DATA_UPDATE: 'data_update'
} as const;

// 导出类型
export type EventNames = typeof EVENT_NAMES[keyof typeof EVENT_NAMES];
